package com.atguigu.proxy.dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class ProxyFactory {

    // 目标对象, Object
    private Object target;

    // 设置被代理的对象，也就是目标对象
    public ProxyFactory(Object target) {
        this.target = target;
    }

    // 根据目标对象 生成代理对象
    public Object getProxyInstance() {
		
		/*
		 *  public static Object newProxyInstance(ClassLoader loader,
                                          Class<?>[] interfaces,
                                          InvocationHandler h)
                                          
            //1. ClassLoader loader: 目标对象使用的类加载器
            //2. Class<?>[] interfaces: 目标对象实现的接口类型
            //3. InvocationHandler h : 事件处理器，执行 `目标对象方法` 的时候，会触发事件处理器，会把当前执行的 `目标对象方法` 做为参数传入
       	 */
        // 在 执行目标对象之前和后 增加两个输出， 既不改变目标对象的方法 又实现了功能，其实相当于扩展了目标对象的功能

        // 可以 实现 InvocationHandler 重写方法 来实现对目标方法的增强，
        InvocationHandler invocationHandler = (proxy, method, args) -> {
            System.out.println("JDK动态代理~~");
            // 反射机智调用 目标对象的方法
            Object returnVal = method.invoke(target, args);
            System.out.println("JDK 代理提交");
            return returnVal;
        };
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                invocationHandler);
    }


}
